package com.sxbbc.common.core.utils;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSONObject;
import com.sxbbc.common.basics.exceptions.ThrowJsonException;
import com.sxbbc.common.basics.service.SpringBeanFactoryUtils;
import com.sxbbc.common.basics.service.redis.RedisUtilsService;
import com.sxbbc.common.core.entity.jz.InfoAli;
import com.sxbbc.common.core.entity.jz.InfoWx;
import com.sxbbc.common.core.enums.redis.RedisExpiredEnums;
import com.sxbbc.common.core.wx.WxUtils;

/**
 * redis工具类
 *
 * @author arno
 */
public class RedisUtils {

    public static RedisUtils redisUtils = null;


    /**
     * 凭证有效时间
     */
    public static final long EXPIRES_IN = 3600;

    public static RedisUtils getInstance() {
        if (redisUtils == null) {
            synchronized (RedisUtils.class) {
                if (redisUtils == null) {
                    redisUtils = new RedisUtils();
                }
            }
        }
        return redisUtils;
    }

    /************************支付宝模块*****************************/

    /**
     * 设置支付宝信息
     */
    public void setAliInfo(InfoAli infos) {
        String obj = JSONObject.toJSONString(infos);
        getRedisUtilsService().setKey("info_ali_", obj);
    }

    /**
     * 获取支付宝信息
     */
    public InfoAli getAliInfo() {
        String obj = getRedisUtilsService().getKey("info_ali_");
        if (StringUtils.isBlank(obj)) {
            throw new ThrowJsonException("ALIPAY IS Null");
        }
        InfoAli infos = JSONObject.parseObject(obj, InfoAli.class);
        return infos;
    }

    /*****************************微信模块****************************/

    /**
     * 设置微信信息
     */
    public void setWxInfo(InfoWx infos) {
        String obj = JSONObject.toJSONString(infos);
        getRedisUtilsService().setKey("info_wx_", obj);
    }

    /**
     * 获取微信信息
     */
    public InfoWx getWxInfo() {
        String obj = getRedisUtilsService().getKey("info_wx_");
        if (StringUtils.isBlank(obj)) {
            throw new ThrowJsonException("WeChat IS Null");
        }
        InfoWx infos = JSONObject.parseObject(obj, InfoWx.class);
        return infos;
    }


    /**
     * 设置微信网页临时token
     *
     * @param infos
     */
    public void setWxToken(InfoWx infos) {
        String token = WxUtils.getInstance().getToken();
        if(StringUtils.isNotBlank(token)) {
            getRedisUtilsService().setKey(RedisExpiredEnums.WX_WEB_TOKEN.getKey(), token, EXPIRES_IN);
        }
    }
    
    /**
     * 
     * 设置微信网页临时token
     * @param token
     * @author Wahyee
     */
    public void setWxToken(String token) {
        if(StringUtils.isNotBlank(token)) {
            getRedisUtilsService().setKey(RedisExpiredEnums.WX_WEB_TOKEN.getKey(), token, EXPIRES_IN);
        }
    }

    /**
     * 获取微信网页临时token
     */
    public String getWxToken() {
        return getRedisUtilsService().getKey(RedisExpiredEnums.WX_WEB_TOKEN.getKey());
    }

    /**
     * 设置微信JS接口的临时票据
     *
     * @param token 微信网页临时token
     * @author xiaoky
     */
    public void setWxJsApiTicket(String token) {
        String jsapiTicket = WxUtils.getInstance().getJSSDKTicket(token);
        if(StringUtils.isNotBlank(jsapiTicket)) {
            getRedisUtilsService().setKey(RedisExpiredEnums.WX_JSAPI_TICKET.getKey(), jsapiTicket, EXPIRES_IN);
        }
    }

    /**
     * 获取微信JS接口的临时票据
     *
     * @return
     * @author xiaoky
     */
    public String getWxJsApiTicket() {
        return getRedisUtilsService().getKey(RedisExpiredEnums.WX_JSAPI_TICKET.getKey());
    }

    /***********小程序********/

    /**
     * 设置微信小程序临时token
     */
    public void setWxProgramToken(InfoWx infos) {
        String token = WxUtils.getInstance().getProgramToken();
        if(StringUtils.isNotBlank(token)) {
            getRedisUtilsService().setKey(RedisExpiredEnums.WX_PROGRAM_TOKEN.getKey(), token, EXPIRES_IN);
        }
    }

    /**
     * 获取微信小程序临时token
     */
    public String getWxProgramToken() {
        return getRedisUtilsService().getKey(RedisExpiredEnums.WX_PROGRAM_TOKEN.getKey());
    }

    /********IP******/
    /**
     * 设置用户IP
     */
    public void setUserIP(String ip, String info) {
        getRedisUtilsService().setKey("IP_"+ip, info, EXPIRES_IN);
    }
    
    /**
     * 设置用户IP永久
     * @param ip
     * @param info
     * @author xiaoky
     */
    public void setUserIPPermanent(String ip, String info) {
    	getRedisUtilsService().setKey("IP_"+ip, info);
    }

    /**
     * 获取用户访问IP
     */
    public String getUserIP(String ip) {
        return getRedisUtilsService().getKey("IP_"+ip);
    }
    
    /**
     * 注入redis
     */
    private RedisUtilsService getRedisUtilsService() {
        return SpringBeanFactoryUtils.getApplicationContext().getBean(RedisUtilsService.class);
    }
}
